feat(map): add heatmap layer#969
Conversation
|
@danditomaso is attempting to deploy a commit to the Meshtastic Team on Vercel. A member of the Team first needs to authorize it. |
There was a problem hiding this comment.
Pull request overview
This PR adds a heatmap visualization layer to the Map component, allowing users to visualize node density or SNR (Signal-to-Noise Ratio) distribution across the map. This has been a requested feature and provides an alternative way to view mesh network data.
Key changes:
- Added
HeatmapLayercomponent with support for two visualization modes: density and SNR - Integrated heatmap controls into the layer visibility tool with radio buttons for mode selection
- Modified hover interaction logic to display node information when hovering over heatmap points
- Updated SNRTooltip component to conditionally render the "to" field for compatibility with single-node tooltips
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 12 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx | New heatmap layer component with configurable density/SNR modes and MapLibre heatmap visualization |
| packages/web/src/pages/Map/index.tsx | Integrated heatmap layer into map page, added hover handling for heatmap interactions, and registered interaction layer |
| packages/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx | Added heatmap visibility toggle with radio button controls for switching between density and SNR modes |
| packages/web/src/components/PageComponents/Map/Layers/SNRLayer.tsx | Modified SNRTooltip to conditionally render the arrow and "to" field, supporting both line and point tooltips |
| packages/web/public/i18n/locales/en/map.json | Added translation keys for heatmap layer and density mode labels |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx
Outdated
Show resolved
Hide resolved
packages/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx
Outdated
Show resolved
Hide resolved
| coordinates: toLngLat(node.position), | ||
| }, | ||
| properties: { | ||
| snr: node.snr ?? -120, |
There was a problem hiding this comment.
The default SNR value of -120 dB seems arbitrary and could be misleading. In SNR mode, nodes without valid SNR data will still contribute to the heatmap with this extreme negative value. Consider either:
- Filtering out nodes without valid SNR in SNR mode
- Using a more meaningful default (e.g., 0 or the minimum expected SNR)
- Adding a comment explaining why -120 was chosen
packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx
Outdated
Show resolved
Hide resolved
| "heatmap-weight": | ||
| mode === "density" | ||
| ? 1 | ||
| : ["interpolate", ["linear"], ["get", "snr"], -20, 0, 10, 1], |
There was a problem hiding this comment.
In SNR mode, the heatmap-weight interpolation maps SNR values from -20 dB (weight: 0) to 10 dB (weight: 1). However, nodes with the default SNR of -120 dB will have a weight far below 0, which could produce unexpected results. Consider:
- Clamping the interpolation with
["case", ["<", ["get", "snr"], -20], 0, ...] - Or filtering out nodes without valid SNR data when in SNR mode
- Or choosing a default SNR value within the interpolation range
| : ["interpolate", ["linear"], ["get", "snr"], -20, 0, 10, 1], | |
| : [ | |
| "case", | |
| ["<", ["get", "snr"], -20], 0, | |
| [">", ["get", "snr"], 10], 1, | |
| ["interpolate", ["linear"], ["get", "snr"], -20, 0, 10, 1] | |
| ], |
packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx
Outdated
Show resolved
Hide resolved
| {to && ( | ||
| <> | ||
| <span className="mx-1">⭢</span> | ||
| <strong className="font-bold">{to ?? ""}</strong> |
There was a problem hiding this comment.
This use of variable 'to' always evaluates to true.
…ayer.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…ool.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…ayer.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Add badge indicator on layers icon. (#894) * feat: indicate number of layers enabled. * Update packages/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: reduced code duplication in layers component * fixed unread message bubble --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(actions): improve main to stable release workflow (#895) * fix(actions): improve main to stable release workflow * Update .github/workflows/update-stable-from-master.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update .github/workflows/update-stable-from-master.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(ui): logic on waypoint layer component caused 0 to be shown in UI (#896) * fix(ui): logic on waypoint layer component caused 0 to be shown in UI * Update packages/web/src/components/PageComponents/Map/Popups/WaypointDetail.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * chore(i18n): New Crowdin Translations by GitHub Action (#899) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * Update readme with new widgets (#901) * chore: add new widgets to readme * add docs url * Update README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat(i18n): add fr localization support (#902) * feat: add fr support * fix(i18n): ensure langs are sorted before being displayed. * feat(ci): add CI workflow to automatically close issue after 60 days (#897) * feat(ci): add CI workflow to automatically close issue after 60 days * run once pe github issue to run once per day * chore(deps): bump vite from 7.1.9 to 7.1.11 (#903) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.9 to 7.1.11. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.1.11/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 7.1.11 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update inactive issue workflow schedule and settings (#905) * Update inactive issue workflow schedule and settings * Update .github/workflows/inactive-issue.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Persists device and app stores across sessions (#860) * Persistence for device and app data * esphemeral -> ephemeral Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * devices -> app Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Additional waypoint methods, update mock, update tests --------- Co-authored-by: philon- <philon-@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix description for historyReturnWindow (#907) It's not number of records but the time window... * Feat(config): Align settings menu to match android/ios (#906) * feat: aligned settings menu to match android/ios * updated sidebar text size. * Update packages/web/public/i18n/locales/en/config.json Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/public/i18n/locales/en/config.json Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/components/PageComponents/Settings/User.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * linting/formatting fixes * fixed formatting issue --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * chore: add new folders to biome config (#910) * chore(i18n): New Crowdin Translations by GitHub Action (#908) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * fix: use correct deprecated GPS coordinate format enum (#917) The Config_DisplayConfig_GpsCoordinateFormat export doesn't exist in the protobufs package. The correct export is Config_DisplayConfig_DeprecatedGpsCoordinateFormat, which matches what's used in the validation schema. Added TODO comment explaining that this field is deprecated since protobufs 2.7.4 and should be migrated to DeviceUIConfig.gps_format when DeviceUI settings are implemented. * style: fix line wrapping for GPS coordinate format enum (#918) - Split long enum reference across multiple lines to improve code readability - Maintains consistent code formatting standards without changing functionality * feat(state): enable deviceStore persistance (#922) * fix(core): ensure core package works in browser (#923) * fix(core): ensure core package works in browser * style(core): revert new line removal * fix: add @serialport/bindings-cpp to onlyBuiltDependencies (#914) * feat(ui): Add UI library (#900) * feat: scaffold UI library * Update packages/ui/src/components/theme-provider.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * add lock file * lint/formatting fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: added skelton loader for message items (#927) * feat(connections): Add connections page (replaces new device dialog) (#919) * feat(conn): add connection screen and logic * fixes from code review * force https * code review fixes * add http for self testing * enable deviceStore persistance * added translations * disabled feature flag * i18n updates * chore: add new folders to biome config (#910) * chore(i18n): New Crowdin Translations by GitHub Action (#908) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * fix: use correct deprecated GPS coordinate format enum (#917) The Config_DisplayConfig_GpsCoordinateFormat export doesn't exist in the protobufs package. The correct export is Config_DisplayConfig_DeprecatedGpsCoordinateFormat, which matches what's used in the validation schema. Added TODO comment explaining that this field is deprecated since protobufs 2.7.4 and should be migrated to DeviceUIConfig.gps_format when DeviceUI settings are implemented. * style: fix line wrapping for GPS coordinate format enum (#918) - Split long enum reference across multiple lines to improve code readability - Maintains consistent code formatting standards without changing functionality * fix(core): ensure core package works in browser (#923) * fix(core): ensure core package works in browser * style(core): revert new line removal * fix: add @serialport/bindings-cpp to onlyBuiltDependencies (#914) * feat(ui): Add UI library (#900) * feat: scaffold UI library * Update packages/ui/src/components/theme-provider.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * add lock file * lint/formatting fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * formatting/linting fixes * fixed some paring logic * fixed connection issue with serial --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Crowdin Bot <support+bot@crowdin.com> Co-authored-by: Kamil Dzieniszewski <kamil.dzieniszewski@gmail.com> Co-authored-by: Azarattum <43073346+Azarattum@users.noreply.github.com> Co-authored-by: Ben Allfree <ben@benallfree.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(ci): add ui library to excluded list (#928) * fix(config): update change registry channel value (#929) * fix(config): update change registry channel value * format/linting * chore(i18n): New Crowdin Translations by GitHub Action (#924) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * fix(connections): ensure connections reflect actual status. (#930) * fix(connection): support port on HTTP connection (#935) * feat(docker): add arm v7 support (#934) * feat(ui): match avatar color other platforms (#933) * feat(ui): match avatar color other platforms * Update packages/web/src/components/UI/Avatar.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/components/DeviceInfoPanel.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(ui): fix add connection dialog typo (#938) * fix(i18n): Correct 'disconnected' typo in connections.json (#943) * fix(i18n): Correct 'disconnected' typo in connections.json * fix(i18n): Correct typo 'checkConnetion' to 'checkConnection' * Fix(i18n): Correct typo in connection test description --------- Co-authored-by: philon- <philon-@users.noreply.github.com> * chore(i18n): New Crowdin Translations by GitHub Action (#941) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * Add 'packages/web' to excluded directories (#947) * refactor: device connection logic, added nonce to get config only (#946) * refactor: device connection logic, added nonce to get config only on connect. * Update packages/web/src/core/services/MeshService.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/pages/Connections/useConnections.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * code review fixes * fixes from code review * ui fixes * refactored meshService, moved code into deviceStore. Fixed some connnection issues * formatting fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: removed duplicate images (#951) * feat: add devcontainer (#953) * fix(ui): add language switcher to connections page (#954) * fix(ui): add language switcher to connections page * desciption length fix * Update packages/web/src/pages/Connections/index.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * add new language picker key --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * chore(i18n): New Crowdin Translations by GitHub Action (#958) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * fix: interpolate longName and shortName in PKI backup download (#959) This caused {{shortName}} and {{longName}} to appear unformatted in the exported key files: ``` === MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) === Private Key: <censored> Public Key: <censored> === END OF KEYS === ``` The fix simply replicates the behaviour used elsewhere in PKIIBackupDialog. * fix(ui): removed internet hosted fonts from app (#955) * fix(ui): removed internet hosted fonts from app * Update packages/web/src/components/generic/Mono.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/components/UI/Typography/Code.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * removed unsupported font extention * formatter fix --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * chore(i18n): New Crowdin Translations by GitHub Action (#962) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * fix(ui): correct typo in languagePicker key and adjust description width (#961) Fixed typo 'languagePickeer' to 'languagePicker' in DeviceInfoPanel and corrected responsive width class from 'md:w-6' to 'md:w-5/6' in Connections page description. * chore(deps-dev): bump happy-dom from 20.0.0 to 20.0.2 (#968) Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 20.0.0 to 20.0.2. - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](capricorn86/happy-dom@v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix(ui): add "never" i18n string, fix "Favorite" tooltip (#965) * fix(ui): add "never" i18n string, fix "Favorite" tooltip * format * format --------- Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru> * feat: add fixed position coordinate picker (#909) * chore: remove unused logo SVG files * feat: add interactive fixed position picker with map interface - Created new FixedPositionPicker component with clickable map for setting device coordinates - Added form field type for fixed position picker that appears when fixedPosition toggle is enabled - Implemented position request functionality to retrieve current device location * feat: display altitude unit based on user's display settings - Added dynamic altitude unit (Meters/Feet) that respects the user's imperial/metric display preference - Updated altitude field description to show the appropriate unit instead of hardcoded "Meters" * refactor: replace any type with MapLayerMouseEvent in map click handler * refactor: improve accessibility and code quality in FixedPositionPicker - Replace hardcoded IDs with useId() hook for proper accessibility - Use Number.isNaN() instead of isNaN() for more reliable type checking - Add radix parameter to parseInt() and remove unnecessary fragment wrapper * refactor: simplify fixed position picker integration - Removed dedicated FixedPositionPicker form field type in favor of toggle's additionalContent prop - Moved FixedPositionPicker to render conditionally within toggle field instead of as separate dynamic field - Streamlined form field types by eliminating FixedPositionPickerFieldProps * style: format code with consistent line breaks and import ordering * refactor: simplify fixed position picker container styling * feat: disable fixed position toggle when GPS is enabled * refactor: use ComponentRef instead of ElementRef in Switch component * refactor: replace interactive map picker with inline coordinate fields for fixed position - Removed FixedPositionPicker component with map interface - Added latitude, longitude, and altitude fields directly to position form - Moved coordinate validation into PositionValidationSchema with proper min/max bounds - Updated translation strings to include coordinate ranges and improved altitude description - Coordinates now sent via setFixedPosition admin message on form submit when fixedPosition is enabled * refactor: simplify toggle field by removing additionalContent prop and unused field spreading - Removed additionalContent prop and its JSDoc documentation from ToggleFieldProps - Removed rendering of additionalContent below toggle switch - Cleaned up Controller render function by removing unused rest spread operator - Renamed field destructuring to controllerField for clarity * refactor: improve fixed position handling and add position broadcast request - Restructure onSubmit to save config before sending admin message - Add position broadcast request after setting fixed position to immediately update display - Add comprehensive debug logging throughout submission flow - Extract coordinate exclusion logic earlier in submission process for clarity - Add 1 second delay before requesting position broadcast to allow fixed position processing * feat: add max length constraint to latitude and longitude fields - Set fieldLength.max to 10 for both latitude and longitude inputs - Prevents excessive decimal precision while maintaining 7 decimal places (±1.1cm accuracy) * feat(ui): add SNR, RSSI, hops info for messages (#963) * feat(ui): add SNR, RSSI, hops, MQTT info for messages * review fixes * zeros for new fields * Move label under the message --------- Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru> * feat(map): add heatmap layer (#969) * feat: add heatmap layer * Update packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/pages/Map/index.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/pages/Map/index.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * lint/formatting fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Revert "feat(ui): add SNR, RSSI, hops info for messages (#963)" (#974) This reverts commit 020e9d6. * Update README with Buf CLI installation instructions (#981) Added instructions for installing the Buf CLI. * Channel bandwidth is kHz, not MHz (#983) --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Crowdin Bot <support+bot@crowdin.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jeremy Gallant <8975765+philon-@users.noreply.github.com> Co-authored-by: philon- <philon-@users.noreply.github.com> Co-authored-by: Wessel <wessel@weebl.me> Co-authored-by: Kamil Dzieniszewski <kamil.dzieniszewski@gmail.com> Co-authored-by: Azarattum <43073346+Azarattum@users.noreply.github.com> Co-authored-by: Ben Allfree <ben@benallfree.com> Co-authored-by: jsacrist <jsacrist@users.noreply.github.com> Co-authored-by: zeo <goonox35@proton.me> Co-authored-by: Kamil Dzieniszewski <kamil.d@playsmart.io> Co-authored-by: Alexey Stepanov <Pmmlabs@users.noreply.github.com> Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru> Co-authored-by: rj-xy <2442596+rj-xy@users.noreply.github.com>
* Add badge indicator on layers icon. (#894) * feat: indicate number of layers enabled. * Update packages/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: reduced code duplication in layers component * fixed unread message bubble --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(actions): improve main to stable release workflow (#895) * fix(actions): improve main to stable release workflow * Update .github/workflows/update-stable-from-master.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update .github/workflows/update-stable-from-master.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(ui): logic on waypoint layer component caused 0 to be shown in UI (#896) * fix(ui): logic on waypoint layer component caused 0 to be shown in UI * Update packages/web/src/components/PageComponents/Map/Popups/WaypointDetail.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * chore(i18n): New Crowdin Translations by GitHub Action (#899) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * Update readme with new widgets (#901) * chore: add new widgets to readme * add docs url * Update README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat(i18n): add fr localization support (#902) * feat: add fr support * fix(i18n): ensure langs are sorted before being displayed. * feat(ci): add CI workflow to automatically close issue after 60 days (#897) * feat(ci): add CI workflow to automatically close issue after 60 days * run once pe github issue to run once per day * chore(deps): bump vite from 7.1.9 to 7.1.11 (#903) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.9 to 7.1.11. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.1.11/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 7.1.11 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update inactive issue workflow schedule and settings (#905) * Update inactive issue workflow schedule and settings * Update .github/workflows/inactive-issue.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Persists device and app stores across sessions (#860) * Persistence for device and app data * esphemeral -> ephemeral Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * devices -> app Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Additional waypoint methods, update mock, update tests --------- Co-authored-by: philon- <philon-@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix description for historyReturnWindow (#907) It's not number of records but the time window... * Feat(config): Align settings menu to match android/ios (#906) * feat: aligned settings menu to match android/ios * updated sidebar text size. * Update packages/web/public/i18n/locales/en/config.json Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/public/i18n/locales/en/config.json Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/components/PageComponents/Settings/User.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * linting/formatting fixes * fixed formatting issue --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * chore: add new folders to biome config (#910) * chore(i18n): New Crowdin Translations by GitHub Action (#908) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * fix: use correct deprecated GPS coordinate format enum (#917) The Config_DisplayConfig_GpsCoordinateFormat export doesn't exist in the protobufs package. The correct export is Config_DisplayConfig_DeprecatedGpsCoordinateFormat, which matches what's used in the validation schema. Added TODO comment explaining that this field is deprecated since protobufs 2.7.4 and should be migrated to DeviceUIConfig.gps_format when DeviceUI settings are implemented. * style: fix line wrapping for GPS coordinate format enum (#918) - Split long enum reference across multiple lines to improve code readability - Maintains consistent code formatting standards without changing functionality * feat(state): enable deviceStore persistance (#922) * fix(core): ensure core package works in browser (#923) * fix(core): ensure core package works in browser * style(core): revert new line removal * fix: add @serialport/bindings-cpp to onlyBuiltDependencies (#914) * feat(ui): Add UI library (#900) * feat: scaffold UI library * Update packages/ui/src/components/theme-provider.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * add lock file * lint/formatting fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: added skelton loader for message items (#927) * feat(connections): Add connections page (replaces new device dialog) (#919) * feat(conn): add connection screen and logic * fixes from code review * force https * code review fixes * add http for self testing * enable deviceStore persistance * added translations * disabled feature flag * i18n updates * chore: add new folders to biome config (#910) * chore(i18n): New Crowdin Translations by GitHub Action (#908) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * fix: use correct deprecated GPS coordinate format enum (#917) The Config_DisplayConfig_GpsCoordinateFormat export doesn't exist in the protobufs package. The correct export is Config_DisplayConfig_DeprecatedGpsCoordinateFormat, which matches what's used in the validation schema. Added TODO comment explaining that this field is deprecated since protobufs 2.7.4 and should be migrated to DeviceUIConfig.gps_format when DeviceUI settings are implemented. * style: fix line wrapping for GPS coordinate format enum (#918) - Split long enum reference across multiple lines to improve code readability - Maintains consistent code formatting standards without changing functionality * fix(core): ensure core package works in browser (#923) * fix(core): ensure core package works in browser * style(core): revert new line removal * fix: add @serialport/bindings-cpp to onlyBuiltDependencies (#914) * feat(ui): Add UI library (#900) * feat: scaffold UI library * Update packages/ui/src/components/theme-provider.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * add lock file * lint/formatting fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * formatting/linting fixes * fixed some paring logic * fixed connection issue with serial --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Crowdin Bot <support+bot@crowdin.com> Co-authored-by: Kamil Dzieniszewski <kamil.dzieniszewski@gmail.com> Co-authored-by: Azarattum <43073346+Azarattum@users.noreply.github.com> Co-authored-by: Ben Allfree <ben@benallfree.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(ci): add ui library to excluded list (#928) * fix(config): update change registry channel value (#929) * fix(config): update change registry channel value * format/linting * chore(i18n): New Crowdin Translations by GitHub Action (#924) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * fix(connections): ensure connections reflect actual status. (#930) * fix(connection): support port on HTTP connection (#935) * feat(docker): add arm v7 support (#934) * feat(ui): match avatar color other platforms (#933) * feat(ui): match avatar color other platforms * Update packages/web/src/components/UI/Avatar.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/components/DeviceInfoPanel.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(ui): fix add connection dialog typo (#938) * fix(i18n): Correct 'disconnected' typo in connections.json (#943) * fix(i18n): Correct 'disconnected' typo in connections.json * fix(i18n): Correct typo 'checkConnetion' to 'checkConnection' * Fix(i18n): Correct typo in connection test description --------- Co-authored-by: philon- <philon-@users.noreply.github.com> * chore(i18n): New Crowdin Translations by GitHub Action (#941) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * Add 'packages/web' to excluded directories (#947) * refactor: device connection logic, added nonce to get config only (#946) * refactor: device connection logic, added nonce to get config only on connect. * Update packages/web/src/core/services/MeshService.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/pages/Connections/useConnections.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * code review fixes * fixes from code review * ui fixes * refactored meshService, moved code into deviceStore. Fixed some connnection issues * formatting fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: removed duplicate images (#951) * feat: add devcontainer (#953) * fix(ui): add language switcher to connections page (#954) * fix(ui): add language switcher to connections page * desciption length fix * Update packages/web/src/pages/Connections/index.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * add new language picker key --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * chore(i18n): New Crowdin Translations by GitHub Action (#958) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * fix: interpolate longName and shortName in PKI backup download (#959) This caused {{shortName}} and {{longName}} to appear unformatted in the exported key files: ``` === MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) === Private Key: <censored> Public Key: <censored> === END OF KEYS === ``` The fix simply replicates the behaviour used elsewhere in PKIIBackupDialog. * fix(ui): removed internet hosted fonts from app (#955) * fix(ui): removed internet hosted fonts from app * Update packages/web/src/components/generic/Mono.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/components/UI/Typography/Code.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * removed unsupported font extention * formatter fix --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * chore(i18n): New Crowdin Translations by GitHub Action (#962) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * fix(ui): correct typo in languagePicker key and adjust description width (#961) Fixed typo 'languagePickeer' to 'languagePicker' in DeviceInfoPanel and corrected responsive width class from 'md:w-6' to 'md:w-5/6' in Connections page description. * chore(deps-dev): bump happy-dom from 20.0.0 to 20.0.2 (#968) Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 20.0.0 to 20.0.2. - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](capricorn86/happy-dom@v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix(ui): add "never" i18n string, fix "Favorite" tooltip (#965) * fix(ui): add "never" i18n string, fix "Favorite" tooltip * format * format --------- Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru> * feat: add fixed position coordinate picker (#909) * chore: remove unused logo SVG files * feat: add interactive fixed position picker with map interface - Created new FixedPositionPicker component with clickable map for setting device coordinates - Added form field type for fixed position picker that appears when fixedPosition toggle is enabled - Implemented position request functionality to retrieve current device location * feat: display altitude unit based on user's display settings - Added dynamic altitude unit (Meters/Feet) that respects the user's imperial/metric display preference - Updated altitude field description to show the appropriate unit instead of hardcoded "Meters" * refactor: replace any type with MapLayerMouseEvent in map click handler * refactor: improve accessibility and code quality in FixedPositionPicker - Replace hardcoded IDs with useId() hook for proper accessibility - Use Number.isNaN() instead of isNaN() for more reliable type checking - Add radix parameter to parseInt() and remove unnecessary fragment wrapper * refactor: simplify fixed position picker integration - Removed dedicated FixedPositionPicker form field type in favor of toggle's additionalContent prop - Moved FixedPositionPicker to render conditionally within toggle field instead of as separate dynamic field - Streamlined form field types by eliminating FixedPositionPickerFieldProps * style: format code with consistent line breaks and import ordering * refactor: simplify fixed position picker container styling * feat: disable fixed position toggle when GPS is enabled * refactor: use ComponentRef instead of ElementRef in Switch component * refactor: replace interactive map picker with inline coordinate fields for fixed position - Removed FixedPositionPicker component with map interface - Added latitude, longitude, and altitude fields directly to position form - Moved coordinate validation into PositionValidationSchema with proper min/max bounds - Updated translation strings to include coordinate ranges and improved altitude description - Coordinates now sent via setFixedPosition admin message on form submit when fixedPosition is enabled * refactor: simplify toggle field by removing additionalContent prop and unused field spreading - Removed additionalContent prop and its JSDoc documentation from ToggleFieldProps - Removed rendering of additionalContent below toggle switch - Cleaned up Controller render function by removing unused rest spread operator - Renamed field destructuring to controllerField for clarity * refactor: improve fixed position handling and add position broadcast request - Restructure onSubmit to save config before sending admin message - Add position broadcast request after setting fixed position to immediately update display - Add comprehensive debug logging throughout submission flow - Extract coordinate exclusion logic earlier in submission process for clarity - Add 1 second delay before requesting position broadcast to allow fixed position processing * feat: add max length constraint to latitude and longitude fields - Set fieldLength.max to 10 for both latitude and longitude inputs - Prevents excessive decimal precision while maintaining 7 decimal places (±1.1cm accuracy) * feat(ui): add SNR, RSSI, hops info for messages (#963) * feat(ui): add SNR, RSSI, hops, MQTT info for messages * review fixes * zeros for new fields * Move label under the message --------- Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru> * feat(map): add heatmap layer (#969) * feat: add heatmap layer * Update packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/pages/Map/index.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/pages/Map/index.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * lint/formatting fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Revert "feat(ui): add SNR, RSSI, hops info for messages (#963)" (#974) This reverts commit 020e9d6. * Update README with Buf CLI installation instructions (#981) Added instructions for installing the Buf CLI. * Channel bandwidth is kHz, not MHz (#983) * fix channel importing bug (#1005) --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Crowdin Bot <support+bot@crowdin.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jeremy Gallant <8975765+philon-@users.noreply.github.com> Co-authored-by: philon- <philon-@users.noreply.github.com> Co-authored-by: Wessel <wessel@weebl.me> Co-authored-by: Kamil Dzieniszewski <kamil.dzieniszewski@gmail.com> Co-authored-by: Azarattum <43073346+Azarattum@users.noreply.github.com> Co-authored-by: Ben Allfree <ben@benallfree.com> Co-authored-by: jsacrist <jsacrist@users.noreply.github.com> Co-authored-by: zeo <goonox35@proton.me> Co-authored-by: Kamil Dzieniszewski <kamil.d@playsmart.io> Co-authored-by: Alexey Stepanov <Pmmlabs@users.noreply.github.com> Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru> Co-authored-by: rj-xy <2442596+rj-xy@users.noreply.github.com>
Description
This PR adds a new layer to the Map component. A heatmap layer has been an ask for a while and this achives that goal. Though the layer coluring may require some further work I think its a good starting point to review the feature and make changes if required. This was one of the required features in issue #967
Related Issues
Changes Made
Testing Done
Manual
Screenshots (if applicable)
Checklist
CONTRIBUTING_I18N_DEVELOPER_GUIDE.md for more details)